# 目录配置
MODULE              = LexicalAnalysis
SRC_DIR             = src
$(MODULE)_BUILD_DIR = $(BUILD_DIR)/$(MODULE)
LIB                 = $(LIB_DIR)/$(MODULE).a
TARGET              = $(BIN_DIR)/$(MODULE)

# 源文件检测
MAIN                = $(MODULE).cpp
$(MODULE)_C_SRCS    = $(wildcard $(SRC_DIR)/*.c)
$(MODULE)_CPP_SRCS  = $(wildcard $(SRC_DIR)/*.cpp)
$(MODULE)_OBJS      = $(patsubst $(SRC_DIR)/%.c,$($(MODULE)_BUILD_DIR)/%.o,$($(MODULE)_C_SRCS)) \
                      $(patsubst $(SRC_DIR)/%.cpp,$($(MODULE)_BUILD_DIR)/%.o,$($(MODULE)_CPP_SRCS)) \

# 默认目标
all: $(TARGET)

# 创建必要目录
dirs:
	@echo "Creating directories of $(MODULE)..."
	@mkdir -pv $($(MODULE)_BUILD_DIR) $($(MODULE)_BIN_DIR)

# 主目标链接
$(TARGET): $(LIB)
	$(CXX) $(CXXFLAGS) $(patsubst %,-I%,$(INCLUDE_DIRS)) $(MAIN) $^ -o $@ $(LDFLAGS)
	@echo -e "=== \e[38;5;82mBuild successful\e[0m -> \e[38;5;202m$(TARGET)\e[0m ==="

$(LIB): $($(MODULE)_OBJS) | dirs
	ar rcs $@ $^

lib: $(LIB)

# C源文件编译
$($(MODULE)_BUILD_DIR)/%.o: $(SRC_DIR)/%.c | dirs
	$(CC) $(CFLAGS) $(patsubst %,-I%,$(INCLUDE_DIRS)) -MMD -c $< -o $@

# C++源文件编译 
$($(MODULE)_BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp | dirs
	$(CXX) $(CXXFLAGS) $(patsubst %,-I%,$(INCLUDE_DIRS)) -MMD -c $< -o $@

# 清理命令
clean:
	@echo "Cleaning build artifacts of $(LexicalAnalysis)..."
	@rm -rfv $($(MODULE)_BUILD_DIR) $(LIB) $($(MODULE)_BIN_DIR)

-include $($(MODULE)_OBJS:.o=.d)

.PHONY: clean
